<?php

namespace app\controllers;

use app\models\Ad;
use dosamigos\qrcode\QrCode;
use Yii;
use yii\helpers\Url;
use yii\image\drivers\Image;
use yii\web\HttpException;
use yii\web\Response;
use yii\web\ServerErrorHttpException;

/**
 * 通用页
 *
 * Class SiteController
 * @package app\controllers
 */
class SiteController extends BaseController
{
    /**
     * 图片处理
     * GET方式提交参数：
     * @var $src string 图片相对与web目录的保存地址
     * @var $w=1000 integer 缩放后的最大宽度
     * @var $h=1000 integer 缩放后的最大高度
     * @var $r=0 integer 旋转角度
     * @var $m=4 integer 图片处理方式
     * @see \yii\image\drivers\Kohana_Image::AUTO
     * 图片处理后使用Yii自带的Cache保存缓存
     */
    public function actionImg()
    {
        $src = Yii::$app->request->get('src');
        $w = Yii::$app->request->get('w', 1000);
        $h = Yii::$app->request->get('h', 1000);
        $r = Yii::$app->request->get('r', 0);
        $m = Yii::$app->request->get('m', Image::AUTO);
        $cache_hash = md5(Url::current());
        $cache = Yii::$app->cache->get($cache_hash);
        if (!empty($cache)) {
            header("Content-Type: image/png");
            echo $cache;
        } else {
            /* @var Yii::$app->image \yii\image\ImageDriver */
            /* @var $image \yii\image\drivers\Image */
            $image = Yii::$app->image->load(Yii::getAlias('@app/web/' . $src));
            header("Content-Type: image/png");
            $_img = $image->resize($w, $h, $m)->rotate($r)->render();
            Yii::$app->cache->set($cache_hash, $_img);
            Yii::$app->cache->set($cache_hash . '_time', time());
            echo $_img;
        }
    }

    /**
     * 生成二维码
     * @var $content string 生成二维码的数据内容
     */
    public function actionQr()
    {
        $content = Yii::$app->request->get('content');
        QrCode::png($content, false, 0, 6, 4, false);
    }

    /**
     * 根据文字生成默认头像
     * @var $txt=' ' string 生成图片的文本
     * @var $w=64 integer 图片宽度
     * @var $h=64 integer 图片高度
     * $var $s=50 integer 文字大小
     * 生成的图片使用Yii自带的Cache保存缓存
     */
    public function actionAvatar()
    {
        $txt = Yii::$app->request->get('txt', ' '); // 文本
        $w   = Yii::$app->request->get('w', 64); // 宽度
        $h   = Yii::$app->request->get('h', 64); // 高度
        $s   = Yii::$app->request->get('s', 50); // 文字大小
        $cache_hash = md5(Url::current());
        $cache = Yii::$app->cache->get($cache_hash);
        if (!empty($cache)) {
            header("Content-Type: image/png");
            echo $cache;
        } else {
            ob_start();
            $im = imagecreate($w, $h);
            // $bg = imagecolorallocate($im, 255, 255, 255);
            $textcolor = imagecolorallocate($im, 71, 143, 202);
            imagettftext($im, $s, 0, $w - $s, $s + ($h - $s) / 2, $textcolor, Yii::getAlias('@yii/captcha/SpicyRice.ttf'), $txt);
            header("Content-type: image/png");
            imagepng($im);
            $_img = ob_get_clean();
            Yii::$app->cache->set($cache_hash, $_img);
            Yii::$app->cache->set($cache_hash . '_time' , time());
            echo $_img;
        }
    }

    /**
     * 广告跳转
     * @var $id integer 广告编号
     * 自动记录广告点击次数
     * @throws HttpException
     * @return \yii\web\Response
     */
    public function actionAd()
    {
        $id = Yii::$app->request->get('id');
        $model = Ad::findOne($id);
        if (empty($model)) {
            throw new HttpException(404, '没有找到广告信息。');
        }
        if ($model->status != Ad::STATUS_ACTIVE
            || ($model->start_time > 0 && $model->start_time > time())
            || ($model->end_time > 0 && $model->end_time < time())) {
            // 广告已经失效，不更新点击数
        } else {
            Ad::updateAllCounters(['click'=>1], ['id'=>$model->id]);
        }
        return $this->redirect($model->url);
    }

    /**
     * 错误页
     * 自动读取错误内容，页面访问的错误直接显示错误页面，AJAX请求则返回格式统一的JSON
     * {
     *     "result":"failure",
     *     "message":"错误提示。",
     *     "errors":...详细错误信息，一般只用来跟踪处理，不作为对用户展示...
     * }
     * @throws ServerErrorHttpException
     * @return array|string
     */
    public function actionError()
    {
        $exception = Yii::$app->errorHandler->exception;
        if ($exception !== null) {
            if ($this->isAjax()) {
                Yii::$app->response->format = Response::FORMAT_JSON;
                return [
                    'result'=>'failure',
                    'message'=>$exception->getMessage(),
                    'errors'=>YII_ENV_DEV ? $exception->getTraceAsString() : ''
                ];
            } else {
                return $this->render('error', [
                    'name'=>'系统发生错误',
                    'message'=>$exception->getMessage(),
                    'exception'=>$exception
                ]);
            }
        }
        throw new ServerErrorHttpException('没有找到任何错误信息。');
    }
}
